package com.bdzl.ecs.util.contractUtils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bdzl.ecs.util.electronicUtils.FddClientBaseUtils;
import com.bdzl.pub.config.Constant;
import com.fadada.sdk.client.FddClientBase;
import com.fadada.sdk.client.request.SignResultQueryRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.crypto.Cipher;
import java.io.File;


/**
 * @创建人 wuwenjie
 * @创建时间 2019/1/7
 * @描述 定位系统
 */
public class ContractUtils {

    /**
     *  个人CA申请接口
     * @param name 客户姓名
     * @param email 客户邮箱
     * @param card 客户证件号码
     * @param cardType 证件类型
    0-身份证（默认值）；
    1-护照；
    2-军人身份证；
    6-社会保障卡；
    A-武装警察身份证件；
    B-港澳通行证；
    C-台湾居民来往大陆通行证；
    E-户口簿
     * @param mobile 客户邮寄号码
     * @return
     */
    public static String CACustomer(String name,String email,String card,String cardType,String mobile){
        FddClientBase clientBase=new FddClientBase(Constant.FDD_APPID,Constant.FDD_APPSECRET,Constant.FDD_VERSION,Constant.FDD_CAURL);
        String response=clientBase.invokeSyncPersonAuto(name,email,card,cardType,mobile);
        System.out.println(response);
        return response;
    }


    /**
     *  客户信息修改接口
     * @param customerId 客户id
     * @param email 客户邮箱
     * @param mobile 客户手机
     * @return
     */
    public static String InfoChange(String customerId,String email,String mobile){
        FddClientBaseUtils clientBase=new FddClientBaseUtils(Constant.FDD_APPID,Constant.FDD_APPSECRET,Constant.FDD_VERSION,Constant.FDD_CAURL);
        String response=clientBase.invokeInfoChangeAuto(customerId,email,mobile);
        System.out.println(response);
        return response;
    }

/*    *//**
     * 企业CA申请接口
     * @param customer_name 企业名称 必填
     * @param email 电子邮箱 可选
     * @param id_mobile 组 织机 构代码 与 手机号码
     * @return
     *//*
    public static String CACustomer(String customer_name,String email,String id_mobile){
        SyncCompanyAuto  clientBase=new SyncCompanyAuto(Constant.FDD_APPID,Constant.FDD_APPSECRET,Constant.FDD_VERSION,Constant.FDD_CAURL);
        String response=clientBase.invoke();
        System.out.println(response);
        return response;
    }*/


    /**
     *  删除电子印章接口
     * @param customerId 客户id
     * @param signatureId 签章编号
     * @return
     */
    public static String RemoveSignature(String customerId,String  signatureId){
        FddClientBaseUtils clientBase=new FddClientBaseUtils(Constant.FDD_APPID,Constant.FDD_APPSECRET,Constant.FDD_VERSION,Constant.FDD_CAURL);
        String response=clientBase.invokeRemoveSignature(customerId,signatureId);
        return  response;
    }

    /**
     *  设置默认章接口
     * @param customerId 客户id
     * @param signatureId 签章编号
     * @return
     */
    public static String DefaultSignature(String customerId,String  signatureId){
        FddClientBaseUtils clientBase=new FddClientBaseUtils(Constant.FDD_APPID,Constant.FDD_APPSECRET,Constant.FDD_VERSION,Constant.FDD_CAURL);
        String response=clientBase.invokeDefaultSignature(customerId,signatureId);
        return  response;
    }

    /**
     * 上传合同模板，参数字段 file和doc_url选一个
     * @param template_id 合同编号 只允许长度<=32的英文或数字字符
     * @param file PDF模板 字段类型 文件流
     * @param doc_url 文档地址 字段类型 字符串
     * @return
     */
    public static String uploadTemplate(String template_id, File file,String doc_url){
        FddClientBase clientbase=new FddClientBase(Constant.FDD_APPID,Constant.FDD_APPSECRET,Constant.FDD_VERSION,Constant.FDD_CAURL);
        String response=clientbase.invokeUploadTemplate(template_id,file,doc_url);
        System.out.println(response);//打印结果，解析JSON报文
        return response;
    }

    /**
     * 2021年4月27日10:56:08
     * 合同生成接口
     * @param docTitle 文档标题
     * @param templateId 模板编号
     * @param fontSize 字体大小 可不填
     * @param fontType 字体类型 0-宋体；1-仿宋；2-黑体；3-楷体；4-微软雅黑
     * @param paramter 填充内容 key为文本域，value为要填充的值，value值传字符类型示例：{"platformName":"TheEarth","borrower":"BossHorse"}
     * @param dynamicTables 动态表格 JsonArray[dynamic_table]字符串每个dynamic_table元素表示一个动态表单，可以生成多个表格。示例（包含两个表格）：[{"datas":[["1","小网","小易","1000"],["2","小云","小音","2000"],["3","小乐","天马","3000"]],"headers":["序号","借款人","贷款人","金额"],"colWidthPercent":[1,4,4,4],"cellHeight":30,"cellHorizontalAlignment":0,"cellVerticalAlignment":5,"pageBegin":1,"theFirstHeader":"附一"}]
     * @param contract_id 合同编号
     * @return {result:返回结果,code:结果代码,msg:描述,download_url:下载地址,viewpdf_url:查看地址}
     */
    public static String invokeGenerateContract(String docTitle,String templateId,String fontSize,String fontType, JSONObject paramter,JSONArray dynamicTables,String contract_id){
        FddClientBase clientbase=new FddClientBase(Constant.FDD_APPID,Constant.FDD_APPSECRET,Constant.FDD_VERSION,Constant.FDD_CAURL);
        String response=clientbase.invokeGenerateContract(templateId,contract_id,docTitle,fontSize,fontType,paramter.toJSONString(),null);
        System.out.println(response);//打印结果，解析JSON报文*/
        return response;
    }



    /**
     * zhaochunyu
     * 文档签署接口（手动）
     * @Data  2021年4月28日11:35:14
     * @param transactionId 交易号  每次请求视为一个交易。只允许长度<=32的英文或数字字符。交易号为接入平台生成，必须保证唯一并自行记录。
     * @param customerId 合同编号   根据合同编号指定在哪份文档上进行签署。合同编号在文档传输或合同生成时设定。
     * @param contractId 客户编号   CA注册时获取。
     * @param docTitle 文档标题
     * @param signKeyword 定位关键字 关键字为文档中的文字内容（要能使用ctrl+f搜索到）。法大大按此关键字进行签章位置的定位，将电子章盖在这个关键字上面。凡出现关键字的地方均会盖上指定用户的电子章，建议关键字在合同中保持唯一。 可选
     * @param keywordStrategy 关键字签章策略 关键字签章策略：0：所有关键字签章（默认）；1：第一个关键字签章；2：最后一个关键字签章； 可选
     * @param returnUrl 页面跳转URL（签署结果同步通知） 当签章完成后，在签章页面停留数秒后浏览器会自动跳转到此URL，内容由接入平台自行展示；参见页面跳转规范（return_url）
     * @param notifyUrl 签署结果异步通知URL 如果指定，当签章完成后，法大大将向此URL发送签署结果。参见签署结果异步通知规范（notify_url）
     * @return response 是组装好的地址，请重定向到这个地址呈现签署页面给用户
     */
    public static String invokeExtSign(String transactionId,String customerId,String contractId,String docTitle,String signKeyword,String keywordStrategy,String returnUrl,String notifyUrl){
        FddClientBase clientbase=new FddClientBase(Constant.FDD_APPID,Constant.FDD_APPSECRET,Constant.FDD_VERSION,Constant.FDD_CAURL);

        String response = clientbase.invokeExtSign(transactionId,customerId,contractId,docTitle,signKeyword,keywordStrategy,returnUrl,notifyUrl);
        System.out.println(response);
        return response;
    }

    /**
     * 客户签署结果查询
     * zhaochunyu
     * @Date 2021年4月28日15:43:08
     * @param contract_id    签署时所传合同编号
     * @param customer_id    签署时所传客户编号
     * @param transaction_id 签署时所传交易号
     * @return  {result:返回结果,code:结果代码,msg:描述,download_url:下载地址,viewpdf_url:查看地址
     *          ,transaction_id:签署交易号,sign_status:签署状态码,sign_status_des:签署状态说明}
     */
    public static String invokeQuerySignResult(String contract_id,String customer_id,String transaction_id){
        FddClientBase clientbase=new FddClientBase(Constant.FDD_APPID,Constant.FDD_APPSECRET,Constant.FDD_VERSION,Constant.FDD_CAURL);
        SignResultQueryRequest signResultQueryRequest = new SignResultQueryRequest();
        signResultQueryRequest.setContractId(contract_id);
        signResultQueryRequest.setCustomerId(customer_id);
        signResultQueryRequest.setTransactionId(transaction_id);
        String Stringresponse=clientbase.invokeQuerySignResult(signResultQueryRequest);
        System.out.println(Stringresponse);
        return Stringresponse;
    }

    /**
     * 文档签署接口 (自动签)
     */
    /**
     * 文档签署接口 (自动签)
     * zhaochunyu
     * @Data 2021年5月8日11:31:56
     * @param transaction_id 交易号 1620456132454
     * @param customer_id 客户编号
     * @param client_role 客户校色
     * @param contract_id 客户角色
     * @param doc_title 文档标题
     * @param sign_keyword 定位关键字
     * @param keyword_strategy 定位关键字
     * @param notify_url 签署结果异步通知URL
     * @return
     */
    public static String invokeExtSignAuto(String  transaction_id,String customer_id,String  client_role,String  contract_id,String  doc_title,String  sign_keyword,String  keyword_strategy,String notify_url){
        FddClientBase clientbase=new FddClientBase(Constant.FDD_APPID,Constant.FDD_APPSECRET,Constant.FDD_VERSION,Constant.FDD_CAURL);
        SignResultQueryRequest signResultQueryRequest = new SignResultQueryRequest();
      //1.关键字定位
        String response =  clientbase.invokeExtSignAuto(transaction_id,customer_id,client_role,contract_id,doc_title,sign_keyword,keyword_strategy,notify_url);
/*        //2.坐标定位
        JSONObject searchLocation=new JSONObject();
        searchLocation.put("pagenum",0);
        searchLocation.put("x",200);//0-800
        searchLocation.put("y",200);//0-1131
        JSONArray signature_positions=new JSONArray();
        signature_positions.add(searchLocation);
        String response=clientbase.invokeExtSignAutoXY(transaction_id,customer_id,client_role,contract_id,doc_title,signature_positions.toJSONString(),notify_url);*/
        return response;
    }

    /**
     * 2021年4月28日16:04:41
     *  合同归档：
     *  接入平台更新合同签署状态为-签署完成，法大大将把合同所有相关
     *  操作记录进行归档存证。归档后将不能再对文档再进行签署操作
     * @param contract_id 合同编号
     * @return {result:返回结果,code:结果代码,msg:描述}
     */
    public static String invokeContractFilling(String contract_id){
        FddClientBase clientbase=new FddClientBase(Constant.FDD_APPID,Constant.FDD_APPSECRET,Constant.FDD_VERSION,Constant.FDD_CAURL);
        String response = clientbase.invokeContractFilling(contract_id);
        return response;
    }

    /**
     * 合同推送
     * @param transaction_id  交易号
     * @param contract_id 合同编号
     * @param customer_id 客户编号
     * @param doc_title   文档标题
     * @param sing_keyword   定位关键字
     * @return
     */
    public static String pushdocExtsign(String transaction_id,String contract_id,String customer_id,String doc_title,String sing_keyword){
        //todo ---配置为生产环境
        FddClientBaseUtils clientBase=new FddClientBaseUtils("001005","VTNaoYhKy14byh5PGBEdW4EV","2.0","https://extapi01.fadada.com/api2/");
        //    public String pushdocExtsign(String validity,String return_url,String limit_type,String push_type,String transaction_id, String customer_id, String client_role, String contract_id, String doc_title, String sign_keyword, String keyword_strategy, String notify_url) {
        String response = clientBase.pushdocExtsign(null,Constant.return_url,null,"1",transaction_id,customer_id,null,contract_id,doc_title,sing_keyword,null,Constant.notify_url);
        return response;
    }
}
